home *** CD-ROM | disk | FTP | other *** search
- 5. MXMS: ACCESO A LA MEMORIA EXTENDIDA MEDIANTE UN
- GESTOR DE MEMORIA
-
- A través de este módulo podremos controlar la memoria extendida
- y mover bloques de memoria de la memoria convencional a la
- memoria extendida y viceversa, la realización de estos programas
- en lenguaje Pascal o C necesita o bien de un ensamblador como
- Turbo Assembler o MS-Assembler o utilizar los servicios que
- proporcionan estos lenguajes para compilar instrucciones en
- ensamblador dentro de un fichero de código fuente PASCAL o C ,
- este procedimiento también se puede desarrollar de dos maneras:
- utilizando la función inline que permite introducir los códigos
- de las rutinas en ensamblador o bien introducir directamente las
- instrucciones de lenguaje maquina en el programa a través de asm,
- independientemente del método elegido, en lenguaje C se suele
- producir la llamada en el momento de la compilación a un
- ensamblador para que genere el código objeto que luego se
- enlazara con los demás módulos de nuestro programa.
-
- Habitualmente se utiliza para las llamadas a estas funciones el
- estándar XMS versión 2.0 o superior, este es el número de versión
- mínimo necesario para que el módulo XMS.PAS funcione.
-
- PROCEDIMIENTOS DEL MαDULO
-
-
- Podemos clasificar los procedimientos de este módulo en
- varias categorías, los de información, petición y liberación de
- memoria, movimiento de bloques de esta e inicialización y
- finalización de la gestión de memoria, en cuanto a la utilización
- cronológica los podemos dividir así:
-
- Procedimientos de inicialización
-
-
- Function Inicializa_Xms: Boolean;
- Devuelve true o false dependiendo de si se ha
- inicializado correctamente la gestión de memoria XMS
- o no.
-
- Procedimientos de búsqueda de Información
-
-
- Procedure Cantidad_Xms_Libre(Var
- Totalxms,Bloque_Max:Integer);
- Devuelve la cantidad de memoria extendida o ampliada
- disponible y el bloque mas grande de esta en Kb.
- Procedure Xms_Info( Handle : Integer; Var Lock,
- Akilobytes : Integer;
- Var Freeh : Integer );
- Devuelve información sobre un bloque
- determinado de memoria extendida
- identificado por el número de handle que se
- pasa en la variable Handle, dicho número se
- tiene que haber obtenido mediante la
- ejecución exitosa de la función Function
- Nuevo_Bloque(Akilobytes:Integer):Integer;
- que devuelve el número de handle antes
- aludido.
-
-
- Procedimientos de manejo de bloques
-
-
- Function Nuevo_Bloque(Akilobytes:Integer):Integer;
-
- Reserva un bloque de memoria extendida identificado
- por un numero llamado handle o manipulador que es
- devuelto por la función.
-
- Procedure Dispon_Bloque(Handle:Integer);
-
- Libera un bloque de memoria extendida con el número
- Handle.
-
- Function
- Cambiar_Tamano_Bloque(Handle,Nuevos_Kilobytes:Integer):
- Boolean;
-
- Cambia el tamaño de un bloque de memoria extendida
- identificado por la variable Handle y de un nuevo
- tamaño de Nuevos_Kilobytes en un entero.
-
- Procedure Mover_Bloque_Emb(Fhandle:Integer;Foffset:Longint;
- Dhandle:Integer;Doffset:Longint; Longitud:Longint);
-
- Mueve un bloque de memoria desde memoria extendida a
- convencional y viceversa y entre memoria extendida
- entre sí.
-
-
- Function Bloquea_Bloque_Emb( Handle : Integer ) : Longint;
-
- El gestor de memoria XMS maneja la memoria de forma
- dinámica para que haya siempre el mayor bloque de
- memoria extendida disponible, por esta razón se
- utilizan los handles en vez de la dirección de los
- bloques de memoria para operar con ellos, si se quiere
- impedir que un bloque sea cambiado en su dirección en
- la memoria por el gestor se acude a esta función con
- el número de handle del bloque correspondiente,
- devuelve un entero de 32 bits que es su dirección en
- la memoria. (normalmente a efectos meramente
- informativos ).
-
- Procedure Desbloquea_Bloque_Emb( Handle : Integer );
-
- Permite que un bloque de memoria extendida sea movido
- por el gestor de memoria XMS.
-
- El procedimiento de llamada a los servicios XMS solo se puede
- realizar con una llamada lejana a una dirección que nos devuelve
- la interrupción del multiplexor ( int 2fh ), con el número de
- función 43h y de subfunción 10h (la subfunción 00 h es para
- averiguar si hay un controlador de memoria XMS ), este
- procedimiento choca con dificultades al ser implementado en un
- lenguaje de alto nivel teniendo que recurrir en este caso a la
- utilización del ensamblador.
-
-